#ifndef GLAD_OWNED_STATES_H
#define GLAD_OWNED_STATES_H

#include <cctype> //used for toupper()

#include "State.h"

class Gladiator;

//-------------------------------------------------------
class InitialState : public State
{
private:
	InitialState(){}

	//copy constructors
	InitialState(const InitialState&);
	InitialState& operator=(const InitialState&);

public:
	static InitialState* Instance();

	virtual void Enter(Gladiator* glad);
	virtual void Execute(Gladiator* glad);
	virtual void Exit(Gladiator* glad);
};

//-------------------------------------------------------
class MainMenu : public State
{
private:
	MainMenu(){}

	//copy constructors
	MainMenu(const MainMenu&);
	MainMenu& operator=(const MainMenu&);

public:
	static MainMenu* Instance();

	virtual void Enter(Gladiator* glad);
	virtual void Execute(Gladiator* glad);
	virtual void Exit(Gladiator* glad);
};

//-------------------------------------------------------
class QuitGame : public State
{
private:
	QuitGame(){}

	//copy constructors
	QuitGame(const QuitGame&);
	QuitGame& operator=(const QuitGame&);

public:
	static QuitGame* Instance();

	virtual void Enter(Gladiator* glad);
	virtual void Execute(Gladiator* glad);
	virtual void Exit(Gladiator* glad);
};

//-------------------------------------------------------
class LoadGame : public State
{
private:
	LoadGame(){}

	//copy constructors
	LoadGame(const LoadGame&);
	LoadGame& operator=(const LoadGame&);

public:
	static LoadGame* Instance();

	virtual void Enter(Gladiator* glad);
	virtual void Execute(Gladiator* glad);
	virtual void Exit(Gladiator* glad);
};

//-------------------------------------------------------
class theInn : public State
{
private:
	theInn(){}

	//copy constructors
	theInn(const theInn&);
	theInn& operator=(const theInn&);

public:
	static theInn* Instance();

	virtual void Enter(Gladiator* glad);
	virtual void Execute(Gladiator* glad);
	virtual void Exit(Gladiator* glad);
};

//-------------------------------------------------------
class theTavern : public State
{
private:
	theTavern(){}

	//copy constructors
	theTavern(const theTavern&);
	theTavern& operator=(const theTavern&);

public:
	static theTavern* Instance();

	virtual void Enter(Gladiator* glad);
	virtual void Execute(Gladiator* glad);
	virtual void Exit(Gladiator* glad);
};

//-------------------------------------------------------
class theShop : public State
{
private:
	theShop(){}

	//copy constructors
	theShop(const theShop&);
	theShop& operator=(const theShop&);

public:
	static theShop* Instance();

	virtual void Enter(Gladiator* glad);
	virtual void Execute(Gladiator* glad);
	virtual void Exit(Gladiator* glad);
};

//-------------------------------------------------------
class theArena : public State
{
private:
	theArena(){}

	//copy constructors
	theArena(const theArena&);
	theArena& operator=(const theArena&);

public:
	static theArena* Instance();

	virtual void Enter(Gladiator* glad);
	virtual void Execute(Gladiator* glad);
	virtual void Exit(Gladiator* glad);
};

#endif